﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Condimar.Entities;
using System.Data;

namespace Condimar.Repository
{
    public class VentaDAO:MasterRepository,IVentaDAO
    {
        public List<Venta> GetAllFromVenta()
        {
            var query = from v in context.Ventas.Include("Cliente").Include("Vendedor1").Include("FormaPago")
                        select v;
            return query.ToList();
        }

        public List<Venta> GetAllFromVentaByCliente(string criterio)
        {
            var query = from v in context.Ventas.Include("Cliente").Include("Vendedor1").Include("FormaPago")
                        select v;
            if (criterio != null && criterio != string.Empty && criterio != "")
            {
                query = from v in context.Ventas.Include("Cliente").Include("Vendedor1").Include("FormaPago")
                        where v.Cliente.Cliente_Juridico.Ruc.Contains(criterio) ||
                                    v.Cliente.Cliente_Juridico.RazonSocial.Contains(criterio) ||
                                    v.Cliente.Cliente_Natural.ApMaterno.Contains(criterio) ||
                                    v.Cliente.Cliente_Natural.ApPaterno.Contains(criterio) ||
                                    v.Cliente.Cliente_Natural.Nombre.Contains(criterio) ||
                                    v.Cliente.Cliente_Natural.Dni.Contains(criterio)
                        select v;
            }
            return query.ToList();
        }

        public List<Venta> GetAllFromVentaByVendedor(string criterio)
        {
            var query = from v in context.Ventas.Include("Cliente").Include("Vendedor1").Include("FormaPago")
                        select v;
            if (criterio != null && criterio != string.Empty && criterio != "")
            {
                query = from v in context.Ventas.Include("Cliente").Include("Vendedor1").Include("FormaPago")
                        where v.Vendedor1.Apellidos.Contains(criterio) ||
                                    v.Vendedor1.Nombres.Contains(criterio) ||
                                    v.Vendedor1.Dni.Contains(criterio)
                        select v;
            }
            return query.ToList();
        }

        public Venta GetAllFromVentaById(int id)
        {
            var query = from v in context.Ventas.Include("Cliente").Include("Vendedor1").Include("FormaPago")
                        where v.Id.Equals(id)
                        select v;
            return query.SingleOrDefault();
        }

        public void AddVenta(Venta venta)
        {
            foreach (var item in venta.DetalleVentas)
            {
                context.Entry(item.Producto).State = EntityState.Unchanged;
                item.Venta.Cliente = null;
                context.Entry(item).State = EntityState.Added;
            }
            venta.Cliente = null;
            venta.FormaPago = null;
            venta.Vendedor1 = null;

            context.Ventas.Add(venta);
            context.SaveChanges();
        }

        public void UpdateVenta(Venta venta)
        {
            var ventaDB = context.Ventas.Find(venta.Id);
            var detVentaDB = (from v in context.DetalleVentas.Include("Producto")
                              where v.VentaId.Equals(venta.Id)
                              select v).ToList();

            List<DetalleVenta> listaProductoEliminadosDB = new List<DetalleVenta>();

            ventaDB.ClienteId = venta.ClienteId;
            ventaDB.Fecha = venta.Fecha;
            ventaDB.FormaPagoId = venta.FormaPagoId;
            ventaDB.Total = venta.Total;
            ventaDB.Vendedor = venta.Vendedor;

            foreach (var item in venta.DetalleVentas)
            {
                var existe = ventaDB.DetalleVentas.Where(p => p.ProductoId.Equals(item.ProductoId)).SingleOrDefault();
                if (existe == null)
                {
                    item.Venta = null;
                    item.Producto = null;
                    context.Entry(item).State = EntityState.Unchanged;
                    context.DetalleVentas.Add(item);
                }
            }

            foreach (var item in ventaDB.DetalleVentas)
            {
                var existe = venta.DetalleVentas.Where(p => p.ProductoId.Equals(item.ProductoId)).SingleOrDefault();
                if (existe == null)
                {
                    listaProductoEliminadosDB.Add(item);
                }
            }

            foreach (var item in listaProductoEliminadosDB)
            {
                context.DetalleVentas.Remove(item);
            }

            context.Entry(ventaDB).State = EntityState.Modified;
            context.SaveChanges();
        }
    }
}
